5장. 작은 뇌세포 하나 쌓아 올리기

출처: 『AI 엔지니어링 선수지식』(youtubedu 자체 제작 학습노트) | 입문판 재구성 — 노트가 1차 소스(PDF 원본 없음)

코드는 분위기만 — numpy·torch·import 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.

거대한 AI 모델도 알고 보면 아주 작은 부품 하나를 수십 층 쌓아 올린 것입니다.

그 작은 부품 하나가 바로 이 장의 주인공입니다.

부품 하나만 이해하면 거대한 모델도 더 이상 무섭지 않습니다.


0. 이 장의 새 단어 (0장에 없는 말 3개)

0장 용어집에 있는 말(벡터·내적·손실·그래디언트·경사하강법·크로스 엔트로피 등)은 이미 안다고 봅니다.

여기서는 0장에 없는 새 단어 딱 3개만 미리 풀어 둡니다.


퍼셉트론(perceptron)

한 문장 뜻 — 입력에 가중치를 곱해 더하고, 그 합이 문턱을 넘으면 신호를 내보내는 아주 작은 인공 뇌세포.

일상비유 — 동아리 가입 결정. "친구 있나? 회비 싼가? 시간 맞나?"를 점수로 따져 합이 일정 점수를 넘으면 가입하는 판단기.

한 줄 예 —

# 입력 점수를 가중치로 곱해 더한 뒤, 문턱을 넘으면 1
out = x @ w - 4          # 가중합 - 문턱

활성화함수(activation function)

한 문장 뜻 — 가중합 결과를 한 번 더 비틀어, 신경망이 곧은 직선이 아닌 복잡한 모양도 배우게 해 주는 함수.

일상비유 — 수도꼭지. 어떤 값은 막고(0으로) 어떤 값은 흘려보내며, 흐름의 모양을 바꾼다.

한 줄 예 —

# 음수는 0으로 막고, 양수는 그대로 흘려보냄 (가장 흔한 ReLU)
out = max(0, x)

오버피팅(overfitting)

한 문장 뜻 — 모델이 배운 문제만 통째로 외워 버려, 처음 보는 새 문제는 못 푸는 현상.

일상비유 — 기출만 달달 외운 학생. 기출은 100점인데 새 시험은 0점.

한 줄 예 —

# 학습 점수는 높은데 시험 점수가 뚝 떨어지면 오버피팅 신호
train_score = 0.99; test_score = 0.55

(귀납 도입) 이런 적 있죠?

"강아지"라는 단어를 숫자 묶음(벡터)으로 바꿨습니다(0장 임베딩).

그런데 이제 그 숫자 묶음으로 무언가를 판단하게 만들어야 합니다.

예를 들어 "이 글은 칭찬인가, 욕인가?"를 골라내고 싶습니다.

손으로 규칙을 일일이 적자니 끝이 없습니다.

여기서 작은 판단기 하나가 등장합니다.

입력 숫자에 중요도(가중치)를 곱해 더하고, 합이 문턱을 넘으면 "그렇다", 못 넘으면 "아니다"를 내보냅니다.

이 작은 판단기가 바로 퍼셉트론입니다.

한 문장 정의 — 퍼셉트론은 입력에 가중치를 곱해 더한 뒤(내적!) 문턱을 넘으면 신호를 내보내는, 신경망의 가장 작은 부품입니다.

여기 한 장면을 봅시다.

입력이 [1, 0, 1], 가중치가 [3, 2, 2]라면 가중합은 1×3 + 0×2 + 1×2 = 5입니다.

이건 0장에서 배운 내적 바로 그것입니다.

문턱이 4라면 5는 4보다 크니, 신호 1(켜짐)이 나갑니다.


이 장에서 딱 4가지만

이 장에서 딱 4가지만

  1. 퍼셉트론 — 가중합(내적) 후 문턱을 넘으면 신호를 내보내는 작은 뇌세포. 신경망의 기본 부품.
  2. 활성화함수 — 가중합을 한 번 더 비틀어 복잡한 패턴을 배우게 함. ReLU(막거나 흘림)·Softmax(점수를 확률로).
  3. 손실·역전파 — 얼마나 틀렸나(손실)를 보고, 오차를 거꾸로 흘려 가중치를 고치는 학습의 심장.
  4. 정규화 — 오버피팅(외우기만 함)을 막는 장치. Dropout(일부 끄기)·LayerNorm(값 정돈).

한 줄 요약 — 거대한 AI는 퍼셉트론·활성화함수·정규화 부품을 수십 층 쌓고, 손실·역전파로 학습한 계산기입니다.


개념 1 — 퍼셉트론: 가장 작은 뇌세포

막히는 장면

숫자 묶음을 받아 "예/아니오"를 골라내고 싶은데, 규칙을 손으로 다 적을 수가 없습니다.

비유 (크게)

동아리에 가입할지 고민한다고 해 봅시다.

"친구가 있나?"는 아주 중요해서 ×3.

"회비가 싼가?"는 ×2.

"시간이 맞나?"도 ×2.

각 항목에 중요도(가중치)를 곱해 다 더한 점수가 일정 선을 넘으면 가입합니다.

이 점수 매기기와 문턱 넘기가 곧 퍼셉트론입니다.

비유 코드 위험
항목마다 중요도 곱해 더하기 x @ w 가중합은 0장의 내적 그대로 — 차원 안 맞으면 막힘
문턱 넘으면 가입 1 if x @ w - 4 > 0 else 0 문턱(편향)을 안 빼면 항상 켜지거나 항상 꺼짐

한 문장 정의 — 퍼셉트론은 "가중합(내적) − 문턱"이 양수면 신호 1, 아니면 0을 내보내는 작은 판단기입니다.

단순 규칙 — 가중합 = 내적입니다. 0장의 내적을 알면 퍼셉트론의 절반은 끝났습니다.

예시 폭격 ①: worked-example (완성된 예)

입력 [1, 0, 1], 가중치 [3, 2, 2], 문턱 4를 직접 계산해 봅니다.

import numpy as np
x = np.array([1, 0, 1]); w = np.array([3, 2, 2])
out = x @ w - 4              # 가중합 5 에서 문턱 4 를 뺌 = 1
print(1 if out > 0 else 0)   # 1 (신호 켜짐)

가중합 5, 문턱 4, 5 − 4 = 1 → 양수 → 신호 1.

예시 폭격 ②: before / after (틀린 예 vs 올바른 예)

before — 문턱(편향)을 빼는 걸 깜빡한 경우.

out = x @ w        # 5. 문턱이 없으니 거의 항상 켜짐

after — 문턱을 빼서 진짜 판단을 하게 한 경우.

out = x @ w - 4    # 1. 문턱을 넘는지 제대로 가림

문턱이 없으면 판단기가 아니라 그냥 덧셈기가 됩니다.

예시 폭격 ③: 부분완성 (빈칸 채우기)

입력 [2, 1], 가중치 [1, 3], 문턱 4일 때 신호가 켜질까요?

out = x @ w - ___      # 빈칸에 문턱 4 를 넣으세요
# 가중합 = 2×1 + 1×3 = 5,  5 - 4 = 1  → 신호 1 (켜짐)

빈칸은 4입니다. 가중합 5가 문턱 4를 넘어 신호가 켜집니다.

예시 폭격 ④: 독립 적용 (직접 판단)

입력 [0, 0, 1], 가중치 [3, 2, 2], 문턱 4면 신호는?

가중합 = 0×3 + 0×2 + 1×2 = 2.

2 − 4 = −2 → 음수 → 신호 0(꺼짐).

미니 시나리오 — "이럴 때 이렇게"

부품 하나로는 너무 단순하다 싶을 때.

→ 퍼셉트론을 수천 개 층층이 쌓으면 심층 신경망이 됩니다.

거대 모델의 피드포워드(FFN) 층이 바로 이 퍼셉트론 묶음입니다.

한 걸음 더 ▸ (지금 몰라도 됨) — 퍼셉트론 하나는 직선밖에 못 긋습니다. 곡선 같은 복잡한 경계는 다음 개념(활성화함수)을 끼우고 여러 층 쌓아야 생깁니다. 지금은 "작은 부품 하나"만 기억하면 충분합니다.


개념 2 — 활성화함수: 한 번 더 비틀기

막히는 장면

퍼셉트론을 아무리 많이 쌓아도, 곱하고 더하기만 반복하면 결국 곧은 직선 하나밖에 못 그립니다.

세상의 패턴은 직선보다 훨씬 구불구불한데 말이죠.

비유 (크게)

수도꼭지를 떠올려 봅시다.

ReLU는 "음수면 꽉 잠그고(0), 양수면 그대로 흘려보냄"입니다. 가장 흔히 씁니다.

Sigmoid는 어떤 값이든 0~1 사이로 짜냅니다.

Softmax는 여러 점수를 받아, 합이 1인 확률 묶음(0장 확률분포!)으로 바꿉니다. 다음 단어 고르기에 씁니다.

비유 코드 위험
음수는 잠그고 양수는 흘림 (ReLU) max(0, x) 비틀기를 안 넣으면 직선밖에 못 배움
점수를 확률로 (Softmax) e / e.sum() 합이 1이 아니면 확률분포가 깨짐

한 문장 정의 — 활성화함수는 가중합 결과를 비선형으로 한 번 더 비틀어, 신경망이 구불구불한 복잡한 패턴도 배우게 하는 함수입니다.

단순 규칙 — 은닉층(중간층)에는 ReLU, 마지막 출력(확률 고르기)에는 Softmax. 이 두 개만 알면 거의 다입니다.

예시 폭격 ①: worked-example (ReLU)

ReLU는 음수를 0으로 바꾸고 양수는 그대로 둡니다.

# ReLU([-2, 3, -1, 5]) → [0, 3, 0, 5]
out = [max(0, v) for v in [-2, 3, -1, 5]]
print(out)   # [0, 3, 0, 5]

−2와 −1은 잠겨서 0, 3과 5는 그대로 흘러갑니다.

예시 폭격 ②: worked-example (Softmax)

Softmax는 점수가 클수록 큰 확률을 주되, 다 더하면 1이 되게 만듭니다.

import numpy as np
def softmax(x):
    e = np.exp(x - x.max()); return e / e.sum()
print(softmax(np.array([1.0, 2.0, 3.0])).round(2))   # [0.09 0.24 0.67]

점수 1·2·3이 확률 0.09·0.24·0.67로 바뀌고, 합은 1입니다.

가장 큰 점수 3이 가장 큰 확률 0.67을 받습니다.

예시 폭격 ③: before / after

before — 활성화함수를 빼고 가중합만 쌓은 경우.

out = (x @ w1) @ w2     # 결국 직선 하나. 곡선 패턴 못 배움

after — 사이에 ReLU를 끼운 경우.

h = [max(0, v) for v in (x @ w1)]   # 한 번 비틀어 줌
out = h @ w2                        # 이제 곡선도 배움

비틀기 하나가 직선을 곡선으로 바꿉니다.

예시 폭격 ④: 부분완성 (빈칸 채우기)

[-5, 0, 2]에 ReLU를 적용하면?

out = [max(0, v) for v in [-5, 0, 2]]
# 결과 = [___, ___, ___]

빈칸은 [0, 0, 2]입니다. −5와 0은 0으로, 2는 그대로.

예시 폭격 ⑤: 독립 적용

Softmax는 큰 값에 큰 확률을 줍니다. [2, 2]처럼 두 점수가 같으면 확률은?

둘이 똑같으니 공평하게 나눠 [0.5, 0.5], 합은 1입니다.

미니 시나리오 — "이럴 때 이렇게"

거대 언어모델이 다음 단어를 고를 때.

→ 마지막 단계에서 Softmax가 어휘 전체의 점수를 확률로 바꿉니다.

그 확률분포에서 하나를 뽑아 다음 단어로 내놓습니다(0장 척추 6 그대로).

한 걸음 더 ▸ (지금 몰라도 됨) — ReLU 말고도 GELU 같은 사촌들이 있습니다. 지금은 "막거나 흘리는 ReLU"와 "확률로 바꾸는 Softmax" 둘만 알면 됩니다.


개념 3 — 손실과 역전파: 틀린 만큼 거꾸로 고치기

막히는 장면

모델이 틀린 답을 냈습니다.

그런데 수천억 개나 되는 가중치(다이얼)를 어느 쪽으로 돌려야 덜 틀릴까요?

하나하나 시험해 볼 수는 없습니다.

비유 (크게)

양궁을 떠올려 봅시다.

화살이 과녁에서 얼마나 빗나갔는지를 봅니다. 이 빗나간 정도가 손실(0장)입니다.

그걸 보고 팔과 자세를 조금씩 교정합니다. 이 교정 신호를 활까지 거꾸로 전달하는 게 역전파입니다.

쏘고, 빗나감을 재고, 자세를 고치기를 반복하면 점점 명중합니다.

비유 코드 위험
얼마나 빗나갔나 재기 (손실) loss = nn.MSELoss()(pred, y) 손실이 안 줄면 학습이 멈춘 것
오차를 거꾸로 전달 (역전파) loss.backward() 그래디언트가 폭발·소실하면 학습이 멈춤

한 문장 정의 — 손실은 예측이 정답에서 얼마나 틀렸는지의 숫자이고, 역전파는 그 오차를 거꾸로 흘려보내 모든 층의 가중치를 고치는 과정입니다.

단순 규칙 — 학습 한 걸음의 흐름: 예측 → 손실 → 역전파 → 경사하강(0장)으로 가중치 수정. 이 네 단계의 반복이 곧 학습입니다.

흐름을 0장 용어로 자세히 풀면 이렇습니다.

예측을 내놓고, 정답과 비교해 손실(크로스 엔트로피, 0장)을 구합니다.

그 손실을 미분(0장)해 그래디언트(0장)를 얻고, 그걸 모든 층에 거꾸로 전달합니다(역전파).

마지막으로 경사하강법(0장)으로 가중치를 한 걸음 고칩니다.

예시 폭격 ①: worked-example (PyTorch 자동)

실제로는 한 줄이면 역전파가 다 일어납니다.

import torch
import torch.nn as nn
model = nn.Linear(3, 1)
x = torch.tensor([[1.0, 0.0, 1.0]]); y = torch.tensor([[1.0]])
loss = nn.MSELoss()(model(x), y)   # 얼마나 틀렸나
loss.backward()                    # 역전파 자동

loss.backward() 한 줄이 모든 층의 그래디언트를 거꾸로 계산해 줍니다.

예시 폭격 ②: before / after (개념 흐름)

before — 손실만 보고 끝낸 경우.

loss = compute_loss(pred, y)   # 틀린 건 알았는데, 어디를 고칠지는 모름

after — 역전파로 고칠 방향까지 구한 경우.

loss = compute_loss(pred, y)
loss.backward()   # 각 가중치를 어느 쪽으로 돌릴지(그래디언트)까지 나옴

손실은 "얼마나 틀렸나", 역전파는 "어디를 어떻게 고치나"입니다.

예시 폭격 ③: 부분완성 (빈칸 채우기)

학습 한 걸음의 순서를 채워 봅시다.

pred = model(x)                # 1) 예측
loss = loss_fn(pred, y)        # 2) ___ (얼마나 틀렸나)
loss.________()                # 3) 역전파 (오차 거꾸로 전달)
optimizer.step()               # 4) 경사하강으로 가중치 수정

2번 빈칸은 손실, 3번 빈칸은 backward입니다.

예시 폭격 ④: 독립 적용

크로스 엔트로피(0장)는 정답에 낮은 확률을 줄수록 벌점이 큽니다.

정답에 0.9 확률을 줬을 때와 0.1을 줬을 때, 손실이 더 큰 쪽은?

-log(0.1)-log(0.9)보다 훨씬 크니, 0.1을 준 쪽의 손실이 큽니다.

미니 시나리오 — "이럴 때 이렇게"

"loss가 안 떨어져요"라는 말은 학습 디버깅 1순위 고민입니다.

→ 예측·손실·역전파·경사하강 네 단계 중 어디가 막혔는지부터 봅니다.

거대 언어모델의 학습 한 걸음도 정확히 이 네 단계입니다(예측 → 크로스 엔트로피 → 역전파 → 수정).

한 걸음 더 ▸ (지금 몰라도 됨) — 역전파가 모든 층에 오차를 전달하는 수학 원리를 체인룰(연쇄법칙)이라고 부릅니다. 다행히 PyTorch가 자동으로 처리해서, 우리는 backward() 한 줄만 부르면 됩니다.


개념 4 — 정규화: 외우기만 하는 걸 막기

막히는 장면

모델이 학습 문제는 완벽하게 맞히는데, 처음 보는 새 문제는 와르르 틀립니다.

배운 걸 통째로 외워 버린 것입니다. 이게 오버피팅입니다.

비유 (크게)

기출만 달달 외운 학생을 떠올려 봅시다.

기출 시험은 100점인데, 새 유형이 나오면 0점입니다.

이걸 막는 장치가 두 개 있습니다.

Dropout은 공부할 때 일부러 뇌세포(뉴런) 몇 개를 꺼서, 한쪽에만 의존하지 못하게 합니다.

LayerNorm은 값들의 평균과 분산(0장 척추에서 본 정돈)을 가지런히 맞춥니다.

비유 코드 위험
일부러 일부 뉴런 끄기 (Dropout) nn.Dropout(0.5) 안 쓰면 기출만 외우는 오버피팅
값들을 평균0·분산1로 정돈 (LayerNorm) nn.LayerNorm(3) 값이 들쭉날쭉하면 학습이 흔들림

한 문장 정의 — 정규화는 모델이 암기만 하고 응용 못 하는 오버피팅을 막는 장치들이며, Dropout(일부 끄기)과 LayerNorm(값 정돈)이 대표입니다.

단순 규칙 — 학습 점수는 높은데 시험 점수가 낮으면 오버피팅. 그때 Dropout·LayerNorm을 켭니다.

예시 폭격 ①: worked-example (LayerNorm)

LayerNorm은 [10, 20, 30]에서 평균 20을 빼고 표준편차로 나눠 가지런히 만듭니다.

import torch
import torch.nn as nn
print(nn.LayerNorm(3)(torch.tensor([[10.0, 20.0, 30.0]])))
# 대략 [-1.22, 0.0, 1.22]  (평균 0, 분산 1)

들쭉날쭉하던 10·20·30이 −1.22·0·1.22로 정돈됩니다.

예시 폭격 ②: before / after (오버피팅 신호)

before — 정규화 없이 학습만 한 경우.

train_score = 0.99   # 기출은 거의 만점
test_score  = 0.55   # 새 시험은 절반. 오버피팅!

after — Dropout을 켜서 외우기를 막은 경우.

train_score = 0.92   # 기출 점수는 살짝 내려가지만
test_score  = 0.85   # 새 시험 점수가 크게 오름

학습 점수를 조금 양보하고 시험 점수를 크게 얻는 거래입니다.

예시 폭격 ③: 부분완성 (빈칸 채우기)

LayerNorm은 무엇을 빼고 무엇으로 나눌까요?

정돈값 = (값 - ____) / 표준편차
# 빈칸 = 평균

빈칸은 평균입니다. 평균을 빼고 표준편차로 나눠 평균0·분산1을 만듭니다.

예시 폭격 ④: 독립 적용

학습 점수 0.98, 시험 점수 0.60인 모델이 있습니다.

이 모델은 오버피팅인가요?

→ 학습은 높은데 시험이 뚝 떨어졌으니 오버피팅입니다. Dropout·LayerNorm을 켜 볼 차례입니다.

미니 시나리오 — "이럴 때 이렇게"

거대 언어모델의 구조도를 보면 블록마다 LayerNorm이 빠짐없이 들어 있습니다.

→ 값을 매 층 정돈해 줘야 수십 층을 쌓아도 학습이 흔들리지 않습니다.

오버피팅은 모든 모델의 적이라, Dropout·LayerNorm은 어디서나 표준 방어입니다.

한 걸음 더 ▸ (지금 몰라도 됨) — 학습을 일찍 멈추는 "조기종료"도 오버피팅을 막는 또 다른 장치입니다. 지금은 Dropout과 LayerNorm 두 개만 알면 충분합니다.


정리

이 장의 부품들이 거대 모델 안에서 맡는 역할입니다.

개념 거대 모델에서의 역할
퍼셉트론 피드포워드(FFN) 층 — 가중합은 곧 내적
ReLU 중간층을 비트는 비선형
Softmax 다음 단어를 확률로 고르는 마지막 출력
손실·역전파 학습 — 틀린 만큼 거꾸로 고침
LayerNorm 모든 블록에 들어가는 값 정돈

한 문장으로, 거대한 AI는 퍼셉트론(가중합) + Softmax(확률) + LayerNorm(정돈) 부품을 수십 층 쌓고, 손실·역전파로 학습한 거대한 계산기입니다.

핵심 세 줄.

퍼셉트론은 가중합(내적) 후 문턱을 넘으면 신호를 내보내는 작은 부품입니다.

활성화함수(ReLU·Softmax)는 가중합을 비틀어 복잡한 패턴과 확률을 만듭니다.

손실·역전파로 틀린 만큼 거꾸로 고치고, 정규화로 외우기만 하는 걸 막습니다.

다음 장 예고 1줄 — 다음 장에서는 이 작은 부품들이 어떻게 거대한 모델의 한 덩어리로 묶이는지 봅니다. (지금 몰라도 됩니다 — 이 장의 부품 4개만 머리에 있으면 충분해요.)


난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플